Boostライブラリ一周の旅
                       ver.1.44.0



                 高橋晶(Akira Takahashi)

   ブログ:「Faith and Brave – C++で遊ぼう」
    http://d.hatena.ne.jp/faith_and_brave/
                      Boost.勉強会#2 2010/09/11(Sat)
はじめに



前回は、Boost 1.40.0までを紹介しました。

今回は1.44.0までの差分を紹介します。
本日紹介するライブラリ


1. Property Tree
2. Uuid
3. Range 2.0
4. Filesystem v3
5. Polygon
6. Meta State Machine(MSM)
Property Tree 1/4
汎用的な、木構造をもつデータのプロパティ管理。
XML、JSON、INIファイルのパーサーを提供している。

全てのデータは、
boost::property_tree::ptree型
に対して操作を行う。

値の取得には、
失敗時に例外を投げるptee::get<T>()と
boost::optionalを返すptree::get_optional<T>()
が用意されている。
Property Tree 2/4
 XMLの読込、要素、属性の取得。
 XMLパーサーにはRapidXmlを採用している。
                                          <root>
                                           <elem attr="World">
                                             Hello
using namespace boost::property_tree;      </elem>
                                          </root>
ptree pt;
read_xml("test.xml", pt, xml_parser::trim_whitespace);

// 要素の取得
const string& elem = pt.get<string>("root.elem");

// 属性の取得 : <xmlattr>という特殊な要素名を介してアクセスする
const string& attr = pt.get<string>("root.elem.<xmlattr>.attr");
Property Tree 3/4
 JSONの読込、データの取得。                         {
                                             "Data": {
                                               "Value": 314,
                                               "Str": "Hello"
                                             }
using namespace boost::property_tree;    }

ptree pt;
read_json("test.json", pt);

const int     value = pt.get<int>("Data.Value");
const string& str = pt.get<string>("Data.Str");
Property Tree 4/4
 iniの読込、データの取得。                          [Data]
                                         Value = 314
                                         Str = Hello


using namespace boost::property_tree;

ptree pt;
read_ini("test.ini", pt);

const int     value = pt.get<int>("Data.Value");
const string& str = pt.get<string>("Data.Str");
Uuid
 ユニークIDの生成。
 COMとか、分散環境での情報の識別とかで
 使われることが多い。

using namespace boost::uuids;

// 擬似乱数生成器でのUUID生成。デフォルトはmt19937
uuid u1 = random_generator()();

// 文字列からUUID生成
uuid u2 = string_generator()("0123456789abcdef0123456789abcdef");

cout << u1 << endl;
cout << u2 << endl;

                      31951f08-5512-4942-99ce-ae2f19351b82
                      01234567-89ab-cdef-0123-456789abcdef
Range2.0 1/2
 ユーティリティ程度だったBoost.Rangeに、
 RangeアルゴリズムとRangeアダプタを拡張。

std::vector<int> v;

// Rangeアルゴリズム : イテレータの組ではなく範囲を渡す
boost::sort(v);
boost::for_each(v, f);

// Rangeアダプタ
using namespace boost::adaptors;
boost::for_each(v | filtered(p) | transformed(conv), f);


 Rangeアルゴリズム : STLアルゴリズムのRange版
 Rangeアダプタ   : 遅延評価され、合成可能な範囲操作
Range 2.0 2/2
 Boost.Foreachと組み合わせて使っても便利。
using namespace boost::adaptors;
std::map<std::string, int> m;

// mapのキーのみを操作
BOOST_FOREACH (const std::string& key, m | map_keys) {
  // something...
}

// mapの値のみを操作
BOOST_FOREACH (const int value, m | map_values) {
  // なにか・・・
}


  RangeライブラリとしてはOvenも強力なのでそちらもチェックしてください!
Filesystem v3
 pathの日本語対応等。
 stringとwstringの両方を使用するためにオーバーロードが
 必要なくなったり。

#define BOOST_FILESYSTEM_VERSION 3
#include <boost/filesystem.hpp>

void foo(const boost::filesystem::path& path) {}

int main()
{
    foo("english");
    foo(L"日本語"); // v2ではエラー
}
Polygon
    平面多角形(2D)のアルゴリズムを提供するライブラリ。
    以下は、三角形の内外判定。
#include <boost/polygon/polygon.hpp>
namespace polygon = boost::polygon;

int main()
{
    const std::vector<polygon::point_data<int>> ptrs = {
        {0, 0}, {10, 0}, {10, 10}
    };
    const polygon::polygon_data<int> poly(ptrs.begin(), ptrs.end());

     // 点が三角形の内側にあるか
     const polygon::point_data<int> p(3, 3);
     assert(polygon::contains(poly, p));
}
Meta State Machine(MSM) 1/2
 新たな状態マシンライブラリ。状態遷移表を直接記述する。
namespace msm = boost::msm;
struct Active : msm::front::state<> {};
struct Stopped : msm::front::state<> {};
struct StartStopEvent {};
struct ResetEvent {};

struct StopWatch_ : msm::front::state_machine_def<StopWatch_> {
    typedef Stopped initial_state;
    struct transition_table : boost::mpl::vector<
//           Start    Event           Next
        _row<Active, StartStopEvent, Stopped>,
        _row<Active, ResetEvent,      Stopped>,
        _row<Stopped, StartStopEvent, Active>
    > {};
};

typedef msm::back::state_machine<StopWatch_> StopWatch;
Meta State Machine(MSM) 2/2
    新たな状態マシンライブラリ。状態遷移表を直接記述する。



int main()
{
    StopWatch watch;

     watch.start();
     watch.process_event(StartStopEvent());   //   stop   ->   run
     watch.process_event(StartStopEvent());   //   run    ->   stop
     watch.process_event(StartStopEvent());   //   stop   ->   run
     watch.process_event(ResetEvent());       //   run    ->   stop
}
まとめ(?)


• 1.44.0になってライブラリがかなり充実しまし
  た。

• とくにRange 2.0はプログラミングスタイルを変
  えるほどのライブラリなのでオススメです。

More Related Content

PDF
[Curso Java Basico] Aula 70: Threads: Definindo prioridades
PDF
[Curso Java Basico] Aula 69: Criando varias Threads + metodos isAlive e join
PDF
PostgreSQL 9.6 새 기능 소개
PDF
Replication MongoDB Days 2013
ODP
Introduction to Kernel Programming
PPTX
Multi threading
PPTX
MongoDB London 2013: Basic Replication in MongoDB presented by Marc Schwering...
PDF
東急Ruby会議向け「rubyの細かい話」
[Curso Java Basico] Aula 70: Threads: Definindo prioridades
[Curso Java Basico] Aula 69: Criando varias Threads + metodos isAlive e join
PostgreSQL 9.6 새 기능 소개
Replication MongoDB Days 2013
Introduction to Kernel Programming
Multi threading
MongoDB London 2013: Basic Replication in MongoDB presented by Marc Schwering...
東急Ruby会議向け「rubyの細かい話」

What's hot (20)

PDF
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
PDF
Use C++ to Manipulate mozSettings in Gecko
PDF
groovy databases
PPTX
What is recursion?
PPT
Java 7 - short intro to NIO.2
PDF
Spock Framework - Slidecast
PPTX
Multithreaded programming
PDF
The TCP/IP stack in the FreeBSD kernel COSCUP 2014
PDF
Building modern web apps with html5, javascript, and java
PPTX
Programming in C
PDF
C++の話(本当にあった怖い話)
PDF
concurrency with GPars
PDF
Effective Modern C++ - Item 35 & 36
PDF
Storm introduction
PDF
Python import mechanism
PDF
[Pgday.Seoul 2021] 2. Porting Oracle UDF and Optimization
DOCX
Network security
PDF
PPTX
R part iii
PDF
Protocol handler in Gecko
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
Use C++ to Manipulate mozSettings in Gecko
groovy databases
What is recursion?
Java 7 - short intro to NIO.2
Spock Framework - Slidecast
Multithreaded programming
The TCP/IP stack in the FreeBSD kernel COSCUP 2014
Building modern web apps with html5, javascript, and java
Programming in C
C++の話(本当にあった怖い話)
concurrency with GPars
Effective Modern C++ - Item 35 & 36
Storm introduction
Python import mechanism
[Pgday.Seoul 2021] 2. Porting Oracle UDF and Optimization
Network security
R part iii
Protocol handler in Gecko
Ad

Similar to Boostライブラリ一周の旅 (8)

PPTX
Boost tour 1_44_0_all
PDF
JVM code reading -- C2
PPTX
C# 6.0 Preview
PDF
Coding in Style
PDF
Notes for xx_use_serialgc
PDF
WebAssembly向け多倍長演算の実装
PDF
第11回 配信講義 計算科学技術特論A(2021)
PDF
Z Garbage Collector
Boost tour 1_44_0_all
JVM code reading -- C2
C# 6.0 Preview
Coding in Style
Notes for xx_use_serialgc
WebAssembly向け多倍長演算の実装
第11回 配信講義 計算科学技術特論A(2021)
Z Garbage Collector
Ad

More from Akira Takahashi (20)

PPTX
Cpp20 overview language features
PDF
Cppmix 02
PPTX
Cppmix 01
PDF
Modern C++ Learning
PDF
cpprefjp documentation
PDF
C++1z draft
PDF
Boost tour 1_61_0 merge
PDF
Boost tour 1_61_0
PDF
error handling using expected
PDF
Boost tour 1.60.0 merge
PDF
Boost tour 1.60.0
PDF
Boost container feature
PDF
Boost Tour 1_58_0 merge
PDF
Boost Tour 1_58_0
PDF
C++14 solve explicit_default_constructor
PDF
C++14 enum hash
PDF
Multi paradigm design
PDF
Start Concurrent
PDF
Programmer mind
PDF
Boost.Study 14 Opening
Cpp20 overview language features
Cppmix 02
Cppmix 01
Modern C++ Learning
cpprefjp documentation
C++1z draft
Boost tour 1_61_0 merge
Boost tour 1_61_0
error handling using expected
Boost tour 1.60.0 merge
Boost tour 1.60.0
Boost container feature
Boost Tour 1_58_0 merge
Boost Tour 1_58_0
C++14 solve explicit_default_constructor
C++14 enum hash
Multi paradigm design
Start Concurrent
Programmer mind
Boost.Study 14 Opening

Boostライブラリ一周の旅

  • 1. Boostライブラリ一周の旅 ver.1.44.0 高橋晶(Akira Takahashi) ブログ:「Faith and Brave – C++で遊ぼう」 http://d.hatena.ne.jp/faith_and_brave/ Boost.勉強会#2 2010/09/11(Sat)
  • 3. 本日紹介するライブラリ 1. Property Tree 2. Uuid 3. Range 2.0 4. Filesystem v3 5. Polygon 6. Meta State Machine(MSM)
  • 5. Property Tree 2/4 XMLの読込、要素、属性の取得。 XMLパーサーにはRapidXmlを採用している。 <root> <elem attr="World"> Hello using namespace boost::property_tree; </elem> </root> ptree pt; read_xml("test.xml", pt, xml_parser::trim_whitespace); // 要素の取得 const string& elem = pt.get<string>("root.elem"); // 属性の取得 : <xmlattr>という特殊な要素名を介してアクセスする const string& attr = pt.get<string>("root.elem.<xmlattr>.attr");
  • 6. Property Tree 3/4 JSONの読込、データの取得。 { "Data": { "Value": 314, "Str": "Hello" } using namespace boost::property_tree; } ptree pt; read_json("test.json", pt); const int value = pt.get<int>("Data.Value"); const string& str = pt.get<string>("Data.Str");
  • 7. Property Tree 4/4 iniの読込、データの取得。 [Data] Value = 314 Str = Hello using namespace boost::property_tree; ptree pt; read_ini("test.ini", pt); const int value = pt.get<int>("Data.Value"); const string& str = pt.get<string>("Data.Str");
  • 8. Uuid ユニークIDの生成。 COMとか、分散環境での情報の識別とかで 使われることが多い。 using namespace boost::uuids; // 擬似乱数生成器でのUUID生成。デフォルトはmt19937 uuid u1 = random_generator()(); // 文字列からUUID生成 uuid u2 = string_generator()("0123456789abcdef0123456789abcdef"); cout << u1 << endl; cout << u2 << endl; 31951f08-5512-4942-99ce-ae2f19351b82 01234567-89ab-cdef-0123-456789abcdef
  • 9. Range2.0 1/2 ユーティリティ程度だったBoost.Rangeに、 RangeアルゴリズムとRangeアダプタを拡張。 std::vector<int> v; // Rangeアルゴリズム : イテレータの組ではなく範囲を渡す boost::sort(v); boost::for_each(v, f); // Rangeアダプタ using namespace boost::adaptors; boost::for_each(v | filtered(p) | transformed(conv), f); Rangeアルゴリズム : STLアルゴリズムのRange版 Rangeアダプタ : 遅延評価され、合成可能な範囲操作
  • 10. Range 2.0 2/2 Boost.Foreachと組み合わせて使っても便利。 using namespace boost::adaptors; std::map<std::string, int> m; // mapのキーのみを操作 BOOST_FOREACH (const std::string& key, m | map_keys) { // something... } // mapの値のみを操作 BOOST_FOREACH (const int value, m | map_values) { // なにか・・・ } RangeライブラリとしてはOvenも強力なのでそちらもチェックしてください!
  • 11. Filesystem v3 pathの日本語対応等。 stringとwstringの両方を使用するためにオーバーロードが 必要なくなったり。 #define BOOST_FILESYSTEM_VERSION 3 #include <boost/filesystem.hpp> void foo(const boost::filesystem::path& path) {} int main() { foo("english"); foo(L"日本語"); // v2ではエラー }
  • 12. Polygon 平面多角形(2D)のアルゴリズムを提供するライブラリ。 以下は、三角形の内外判定。 #include <boost/polygon/polygon.hpp> namespace polygon = boost::polygon; int main() { const std::vector<polygon::point_data<int>> ptrs = { {0, 0}, {10, 0}, {10, 10} }; const polygon::polygon_data<int> poly(ptrs.begin(), ptrs.end()); // 点が三角形の内側にあるか const polygon::point_data<int> p(3, 3); assert(polygon::contains(poly, p)); }
  • 13. Meta State Machine(MSM) 1/2 新たな状態マシンライブラリ。状態遷移表を直接記述する。 namespace msm = boost::msm; struct Active : msm::front::state<> {}; struct Stopped : msm::front::state<> {}; struct StartStopEvent {}; struct ResetEvent {}; struct StopWatch_ : msm::front::state_machine_def<StopWatch_> { typedef Stopped initial_state; struct transition_table : boost::mpl::vector< // Start Event Next _row<Active, StartStopEvent, Stopped>, _row<Active, ResetEvent, Stopped>, _row<Stopped, StartStopEvent, Active> > {}; }; typedef msm::back::state_machine<StopWatch_> StopWatch;
  • 14. Meta State Machine(MSM) 2/2 新たな状態マシンライブラリ。状態遷移表を直接記述する。 int main() { StopWatch watch; watch.start(); watch.process_event(StartStopEvent()); // stop -> run watch.process_event(StartStopEvent()); // run -> stop watch.process_event(StartStopEvent()); // stop -> run watch.process_event(ResetEvent()); // run -> stop }
  • 15. まとめ(?) • 1.44.0になってライブラリがかなり充実しまし た。 • とくにRange 2.0はプログラミングスタイルを変 えるほどのライブラリなのでオススメです。